﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace NDF.Reflection
{
    /// <summary>
    /// 提供一组常用工具方法，用于快速获取对象 <see cref="System.Object"/> 的成员(MemberInfo，包括 属性、方法、字段、事件 等)信息。
    /// </summary>
    public static class ReflectionMembersHelper
    {

        ///// <summary>
        ///// 按名称和成员访问类型查找对象中的成员(包含公共、私有、受限等所有访问范围)。
        ///// </summary>
        ///// <param name="value">用于查找成员信息的对象。</param>
        ///// <param name="name">成员名称，如果该参数为 Null 或者空字符串或者全为空格，则不按照成员名称过滤；否则返回的数组中仅包含该参数所示名称的成员。</param>
        ///// <returns>返回一个数组，数组中的每个元素都是 value 对象所属类型的一个成员(MemberInfo，包括 属性、方法、字段、事件 等)。</returns>
        //public static MemberInfo[] GetAllMembers(this object value, string name)
        //{
        //    return GetMembers(value, name, BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance).Distinct().ToArray();
        //}


        ///// <summary>
        ///// 查找对象中的所有公共成员。
        ///// </summary>
        ///// <param name="value">用于查找成员信息的对象。</param>
        ///// <returns>返回一个数组，数组中的每个元素都是 value 对象所属类型的一个公共成员(MemberInfo，包括 属性、方法、字段、事件 等)。</returns>
        //public static MemberInfo[] GetMembers(this object value)
        //{
        //    return GetMembers(value, null);
        //}
        
        ///// <summary>
        ///// 按名称查找对象中的所有公共成员。
        ///// </summary>
        ///// <param name="value">用于查找成员信息的对象。</param>
        ///// <param name="name">成员名称，如果该参数为 Null 或者空字符串或者全为空格，则不按照成员名称过滤；否则返回的数组中仅包含该参数所示名称的成员。</param>
        ///// <returns>返回一个数组，数组中的每个元素都是 value 对象所属类型的一个公共成员(MemberInfo，包括 属性、方法、字段、事件 等)。</returns>
        //public static MemberInfo[] GetMembers(this object value, string name)
        //{
        //    Guard.ArgumentNotNull(value, "value");
        //    MemberInfo[] members = value.GetType().GetMembers();
        //    return string.IsNullOrWhiteSpace(name) ? members : members.Where(m => m.Name == name).ToArray();
        //}

        ///// <summary>
        ///// 按成员访问类型查找对象中的所有成员。
        ///// </summary>
        ///// <param name="value">用于查找成员信息的对象。</param>
        ///// <param name="bindingAttr">成员的访问类型。</param>
        ///// <returns>返回一个数组，数组中的每个元素都是 value 对象所属类型的一个成员(MemberInfo，包括 属性、方法、字段、事件 等)。</returns>
        //public static MemberInfo[] GetMembers(this object value, BindingFlags bindingAttr)
        //{
        //    return GetMembers(value, null, bindingAttr);
        //}

        ///// <summary>
        ///// 按名称和成员访问类型查找对象中的所有成员。
        ///// </summary>
        ///// <param name="value">用于查找成员信息的对象。</param>
        ///// <param name="name">成员名称，如果该参数为 Null 或者空字符串或者全为空格，则不按照成员名称过滤；否则返回的数组中仅包含该参数所示名称的成员。</param>
        ///// <param name="bindingAttr">成员的访问类型。</param>
        ///// <returns>返回一个数组，数组中的每个元素都是 value 对象所属类型的一个成员(MemberInfo，包括 属性、方法、字段、事件 等)。</returns>
        //public static MemberInfo[] GetMembers(this object value, string name, BindingFlags bindingAttr)
        //{
        //    Guard.ArgumentNotNull(value, "value");
        //    MemberInfo[] members = value.GetType().GetMembers(bindingAttr);
        //    return string.IsNullOrWhiteSpace(name) ? members : members.Where(m => m.Name == name).ToArray();
        //}
    }
}
